package presentation;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import englishChicken.AlmacenDeEventos;
import englishChicken.AlmacenDeJuegos;
import englishChicken.AlmacenDeUsuarios;
import englishChicken.Evento;
import englishChicken.Juego;
import englishChicken.Usuario;


 public class FrontController extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
  
	private static final long serialVersionUID = 1L;

	public void init() throws ServletException {
	 }

	 protected void doGet(HttpServletRequest request, HttpServletResponse response) 
	 throws ServletException, IOException {
		 processRequest(request, response);

	 }

	 protected void doPost(HttpServletRequest request, HttpServletResponse response) 
	 throws ServletException, IOException {
		 processRequest(request, response);
	 }

	 public void processRequest(HttpServletRequest request, HttpServletResponse response) 
	 throws IOException, ServletException {
		 String accion=request.getParameter("action");
		 if(accion.equals("logout")){
			 System.out.println("Cerrar sesion");
			 HttpSession session = request.getSession(false);
			 session.removeAttribute("login_user");
			 session.removeAttribute("login_id");
			 response.setContentType("text/plain");
	         response.setHeader("Cache-Control", "no-cache");
	         response.getWriter().write("logout");
		 }
		 else if(accion.equals("login")){
			 System.out.println("Abrir sesion");
			 if (logado(request)){
				 response.setContentType("text/plain");
		         response.setHeader("Cache-Control", "no-cache");
		         response.getWriter().write(request.getParameter("user"));
			 }
			 else{
				 response.setContentType("text/plain");
		         response.setHeader("Cache-Control", "no-cache");
		         response.getWriter().write("null");
			 }
		 }
		 else if(accion.equals("checkUser")){
			 System.out.println("Comprobar usuario");
			 String uN=request.getParameter("userNick");
			 AlmacenDeUsuarios adu=AlmacenDeUsuarios.getInstance();
			 response.setContentType("text/plain");
	         response.setHeader("Cache-Control", "no-cache");
	         response.getWriter().write(adu.getUsuario(uN)==null?"noExiste":"existe");
		 }
		 else if(accion.equals("checkPass")){
			 System.out.println("Comprobar contraseña");
			 String uN=request.getParameter("userNick");
			 String uP=request.getParameter("userPass");
			 AlmacenDeUsuarios adu=AlmacenDeUsuarios.getInstance();
			 response.setContentType("text/plain");
	         response.setHeader("Cache-Control", "no-cache");
	         response.getWriter().write((adu.getUsuario(uN).getPass()).equals(uP)?"coinciden":"noCoinciden");
		 }
		 else if(accion.equals("misJuegosApadrinados")){
			 procesarMisJuegosApadrinados(request);
			 response.setContentType("text/plain");
	         response.setHeader("Cache-Control", "no-cache");
	         response.getWriter().write("ok");
		 }
		 else if(accion.equals("buscarEvento")){
			 Map<String,String> res=procesarBusquedaEvento(request);
			 HttpSession session = request.getSession();
			 session.setAttribute("busquedaEvento",res);
			 String resource = "buscadorEventoResultados.jsp";
			 System.out.println("Redireccion a " + resource);
			 RequestDispatcher d = request.getRequestDispatcher(resource);
			 if(d!=null){
				 d.forward(request,response);
			 }
		 }
		 else if(accion.equals("redirect")){
			 String resource = request.getParameter("url");
			 System.out.println("Redireccion a " + resource);
			 RequestDispatcher d = request.getRequestDispatcher(resource);
			 if(d!=null){
				 d.forward(request,response);
			 }
		 }

		}

	 private boolean logado(HttpServletRequest request) {
		 boolean logado = false;

		 HttpSession session = request.getSession(false);

		 String userForm = request.getParameter("user");
		 String passwdForm = request.getParameter("pass");

		 if (session == null) {
			 session = request.getSession();
			 if (userForm == null || passwdForm == null || userForm.length() == 0 || passwdForm.length() == 0) {
				 logado = false;

			 } else {
				 if (valido(userForm, passwdForm)) {
					 logado = true;
					 session.setAttribute("login_user", userForm);
					 AlmacenDeUsuarios adu=AlmacenDeUsuarios.getInstance();
					 Usuario uAct=adu.getUsuario(userForm);
					 session.setAttribute("login_id", uAct.getUid());
				 } else {
					 logado = false;
				 }

			 }

		 } else {
			 if (userForm == null || passwdForm == null) {
				 logado = true;
			 } else {
				 if (valido(userForm, passwdForm)) {
					 logado = true;
					 session.setAttribute("login_user", userForm);
					 AlmacenDeUsuarios adu=AlmacenDeUsuarios.getInstance();
					 Usuario uAct=adu.getUsuario(userForm);
					 session.setAttribute("login_id", uAct.getUid());
				 } else {
					 logado = false;
				 }

			 }
		 }
		 return logado;
	 }

	 public boolean valido(String userForm, String passwdForm) {
		 boolean res = false;
		 AlmacenDeUsuarios adu=AlmacenDeUsuarios.getInstance();
		 Usuario uSearched=adu.getUsuario(userForm);
		 if(uSearched!=null){
			 res=passwdForm.equals(uSearched.getPass());
			 System.out.println("Comparamos para "+userForm+" "+passwdForm+" con "+uSearched.getPass());
		 }
		 return res;
	 }
	 
	 public void procesarMisJuegosApadrinados(HttpServletRequest request){
		String accion=request.getParameter("efecto");
		if(accion!=null){
			AlmacenDeJuegos adj=AlmacenDeJuegos.getInstance();
			AlmacenDeEventos ade=AlmacenDeEventos.getInstance();
			AlmacenDeUsuarios adu=AlmacenDeUsuarios.getInstance();
			HttpSession session = request.getSession(false);
			String userUID=(String)session.getAttribute("login_id");
			Usuario uAct=adu.getUsuarioUid(userUID);
			if(accion.equals("asociar")){
				System.out.println("Asociamos un juevo a un evento");
				String j=request.getParameter("juego");
				String e=request.getParameter("evento");
				Juego jAct=adj.getJuegoUid(j);
				Evento eAct=ade.getEventoUid(e);
				jAct.addEvento(e);
				if(!eAct.esOrganizador(uAct.getUid())){
					eAct.addOrganizadorE(uAct.getUid());
				}
				eAct.addJuegoE(j,uAct.getUid());
				ade.actualizarEvento(eAct);
			}
			else if(accion.equals("desasociar")){
				System.out.println("Desasociamos un juevo a un evento");
				String j=request.getParameter("juego");
				String e=request.getParameter("evento");
				Juego jAct=adj.getJuegoUid(j);
				Evento eAct=ade.getEventoUid(e);
				jAct.removeEvento(e);
				eAct.removeJuegoE(j,uAct.getUid());
				ade.actualizarEvento(eAct);
			}
			else if(accion.equals("aceptarPadrino")){
				System.out.println("Aceptamos un padrino");
				String j=request.getParameter("juego");
				String p=request.getParameter("padrino");
				Juego jAct=adj.getJuegoUid(j);
				jAct.removeSolicitudPadrino(p);
				jAct.addPadrino(p);
				Usuario padrino=adu.getUsuarioUid(p);
				padrino.removeSolicitudPadrino(j);
				padrino.addJuegoApadrinado(j,p);
			}
			else if(accion.equals("denegarPadrino")){
				System.out.println("Denegamos un padrino");
				String j=request.getParameter("juego");
				String p=request.getParameter("padrino");
				Juego jAct=adj.getJuegoUid(j);
				jAct.removeSolicitudPadrino(p);
				Usuario padrino=adu.getUsuarioUid(p);
				padrino.removeSolicitudPadrino(j);
			}
		}
	 }
	 
	 public Map<String,String> procesarBusquedaEvento(HttpServletRequest request){
		Map<String,String> param1=new HashMap<String,String>();
		param1.put("sNom",request.getParameter("nombre"));
		String sFeI=request.getParameter("yearFI");
		sFeI+="-"+request.getParameter("mesFI");
		sFeI+="-"+request.getParameter("diaFI");
		param1.put("sFeI",sFeI);
		String sFeF=request.getParameter("yearFF");
		sFeF+="-"+request.getParameter("mesFF");
		sFeF+="-"+request.getParameter("diaFF");
		param1.put("sFeF",sFeF);
		param1.put("sNuM",request.getParameter("partiMin"));
		param1.put("sNuX",request.getParameter("partiMax"));
		Map<String,String[]> param2=new HashMap<String,String[]>();
		param2.put("sJuY",request.getParameterValues("juegos_y"));
		param2.put("sJuN",request.getParameterValues("juegos_n"));
		param2.put("sUsY",request.getParameterValues("usuarios_y"));
		param2.put("sUsN",request.getParameterValues("usuarios_n"));
		param2.put("sOrY",request.getParameterValues("organizadores_y"));
		param2.put("sOrN",request.getParameterValues("organizadores_n"));
		AlmacenDeEventos ade=AlmacenDeEventos.getInstance();
		Map<String,String> resultados=ade.buscar(param1,param2);
		return resultados;
	 }
}